package com.fsm.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundZSetOperations;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.Arrays;
import java.util.HashSet;

/*******************
 *@Describe
 *@author 封神梦
 *@Time 2023/6/13
 *@Company http://com.yiview.com
 ****************/
public class ZSetRedisService {

    @Autowired
    private RedisTemplate redisTemplate;
//    1)、向集合中插入元素，并设置分数

    public void set(String key, String value) {
//1、通过redisTemplate设置值
        redisTemplate.boundZSetOps("zSetKey").add("zSetVaule", 100D);

        //2、通过BoundValueOperations设置值
        BoundZSetOperations zSetKey = redisTemplate.boundZSetOps("zSetKey");
        zSetKey.add("zSetVaule", 100D);

        //3、通过ValueOperations设置值
        ZSetOperations zSetOps = redisTemplate.opsForZSet();
        zSetOps.add("zSetKey", "zSetVaule", 100D);
    }

    //2)、向集合中插入多个元素,并设置分数
    public void AddList() {
        DefaultTypedTuple<String> p1 = new DefaultTypedTuple<>("zSetVaule1", 2.1D);
        DefaultTypedTuple<String> p2 = new DefaultTypedTuple<>("zSetVaule2", 3.3D);
        redisTemplate.boundZSetOps("zSetKey").add(new HashSet<>(Arrays.asList(p1, p2)));
    }

//3)、按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部
//    Set<String> range = redisTemplate.boundZSetOps("zSetKey").range(0, -1);
//1
//4)、获得指定元素的分数
//    Double score = redisTemplate.boundZSetOps("zSetKey").score("zSetVaule");
//1
//5)、返回集合内的成员个数
//    Long size = redisTemplate.boundZSetOps("zSetKey").size();
//1
//6)、返回集合内指定分数范围的成员个数（Double类型）
//    Long COUNT = redisTemplate.boundZSetOps("zSetKey").count(0D, 2.2D);
//1
//7)、返回集合内元素在指定分数范围内的排名（从小到大）
//    Set byScore = redisTemplate.boundZSetOps("zSetKey").rangeByScore(0D, 2.2D);
//1
//8)、带偏移量和个数，(key，起始分数，最大分数，偏移量，个数)
//    Set<String> ranking2 = redisTemplate.opsForZSet().rangeByScore("zSetKey", 0D, 2.2D 1, 3);
//1
//9)、返回集合内元素的排名，以及分数（从小到大）
//    Set<TypedTuple<String>> tuples = redisTemplate.boundZSetOps("zSetKey").rangeWithScores(0L, 3L);
//  for (TypedTuple<String> tuple : tuples) {
//System.out.println(tuple.getValue() + " : " + tuple.getScore());
//    }ss

//10)、返回指定成员的排名

//    //从小到大
//    Long startRank = redisTemplate.boundZSetOps("zSetKey").rank("zSetVaule");
//    //从大到小
//    Long endRank = redisTemplate.boundZSetOps("zSetKey").reverseRank("zSetVaule");


    public void deleteKey() {
//11)、从集合中删除指定元素
        redisTemplate.boundZSetOps("zSetKey").remove("zSetVaule");

//12)、删除指定索引范围的元素（Long类型）
        redisTemplate.boundZSetOps("zSetKey").removeRange(0L, 3L);

//13)、删除指定分数范围内的元素（Double类型）
        redisTemplate.boundZSetOps("zSetKey").removeRangeByScore(0D, 2.2D);
    }
//1
//14)、为指定元素加分（Double类型）
//    Double score = redisTemplate.boundZSetOps("zSetKey").incrementScore("zSetVaule",1.1D); 
}
